package com.ssy.invoicing.common.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chapter;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.List;
import com.itextpdf.text.ListItem;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.Section;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

public class PDFUtil {
    public static final String    CHARACTOR_FONT_CH_FILE   = "C:/Windows/Fonts/SIMHEI.TTF"; //黑体常规 
    public static final String    CHARACTOR_FONT_CH_STSONG = "STSong-Light";
    public static final String    CHARACTOR_FONT_CH_UNIGB  = "UniGB-UCS2-H";
    public static final Rectangle PAGE_SIZE                = PageSize.A4;
    public static final float     MARGIN_LEFT              = 50;
    public static final float     MARGIN_RIGHT             = 50;
    public static final float     MARGIN_TOP               = 50;
    public static final float     MARGIN_BOTTOM            = 50;
    public static final float     SPACING                  = 20;
    public Document              document                 = null;

    /**
     * 功能：创建导出数据的目标文档
     * @param fileName 存储文件的临时路径
     * @return
     */
    public void createDocument(String fileName) {
        File file = new File(fileName);
        FileOutputStream out = null;
        document = new Document(PAGE_SIZE, MARGIN_LEFT, MARGIN_RIGHT, MARGIN_TOP, MARGIN_BOTTOM);
        try {
            out = new FileOutputStream(file);
            PdfWriter.getInstance(document, out);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        // 打开文档准备写入内容  
        document.open();
    }

    /**
     * 将章节写入到指定的PDF文档中
     * @param chapter
     * @return
     */
    public void writeChapterToDoc(Chapter chapter) {
        try {
            if (document != null) {
                if (!document.isOpen())
                    document.open();
                document.add(chapter);
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

    /**
     * 功能 创建PDF文档中的章节
     * 
     * @param title 章节标题
     * @param chapterNum 章节序列号
     * @param alignment 0表示align=left，1表示align=center
     * @param numberDepth 章节是否带序号 设值=1 表示带序号 1.章节一；1.1小节一...，设值=0表示不带序号
     * @param font 字体格式
     * @return Chapter章节
     */
    public static Chapter createChapter(String title, int chapterNum, int alignment,
                                        int numberDepth, Font font) {
        Paragraph chapterTitle = new Paragraph(title, font);
        chapterTitle.setAlignment(alignment);
        Chapter chapter = new Chapter(chapterTitle, chapterNum);
        chapter.setNumberDepth(numberDepth);
        return chapter;
    }

    /**
     * 功能：创建某指定章节下的小节
     * 
     * @param chapter 指定章节
     * @param title 小节标题
     * @param font 字体格式
     * @param numberDepth 小节是否带序号 设值=1 表示带序号 1.章节一；1.1小节一...，设值=0表示不带序号
     * @return section在指定章节后追加小节
     */
    public static Section createSection(Chapter chapter, String title, Font font, int numberDepth) {
        Section section = null;
        if (chapter != null) {
            Paragraph sectionTitle = new Paragraph(title, font);
            sectionTitle.setSpacingBefore(SPACING);
            section = chapter.addSection(sectionTitle);
            section.setNumberDepth(numberDepth);
        }
        return section;
    }

    /**
     * 功能：向PDF文档中添加的内容
     * 
     * @param text 内容
     * @param font 内容对应的字体
     * @return phrase 指定字体格式的内容
     */
    public static Phrase createPhrase(String text, Font font) {
        Phrase phrase = new Paragraph(text, font);
        return phrase;
    }

    /**
     * 功能：创建列表
     * 
     * @param numbered 设置为 true 表明想创建一个进行编号的列表
     * @param lettered 设置为true表示列表采用字母进行编号，为false则用数字进行编号
     * @param symbolIndent
     * @return list
     */
    public static List createList(boolean numbered, boolean lettered, float symbolIndent) {
        List list = new List(numbered, lettered, symbolIndent);
        return list;
    }

    /**
     * 功能：创建列表中的项
     * 
     * @param content 列表项中的内容
     * @param font 字体格式
     * @return listItem
     */
    public static ListItem createListItem(String content, Font font) {
        ListItem listItem = new ListItem(content, font);
        return listItem;
    }

    /**
     * 功能：创造字体格式
     * 
     * @param fontname
     * @param size 字体大小
     * @param style 字体风格
     * @param color 字体颜色
     * @return Font
     */
    public static Font createFont(String fontname, float size, int style, BaseColor color) {
        Font font = FontFactory.getFont(fontname, size, style, color);
        return font;
    }

    /**
     * 功能： 返回支持中文的字体---仿宋
     * @param size 字体大小
     * @param style 字体风格
     * @param color 字体 颜色
     * @return 字体格式
     */
    public static Font createCHineseFont(float size, int style, BaseColor color) {
        BaseFont bfChinese = null;
        try {
            String OS = System.getProperty("os.name").toLowerCase();
            if (OS.indexOf("windows") > -1) {
                //Window操作系统
                bfChinese = BaseFont.createFont(CHARACTOR_FONT_CH_FILE, BaseFont.IDENTITY_H,
                        BaseFont.EMBEDDED);
            } else if (OS.indexOf("linux") > -1) {
                bfChinese = BaseFont.createFont(CHARACTOR_FONT_CH_STSONG, CHARACTOR_FONT_CH_UNIGB, false);
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new Font(bfChinese, size, style, color);
    }

    /**
     * 最后关闭PDF文档
     */
    public void closeDocument() {
        if (document != null) {
            document.close();
        }
    }

    /**
     * 读PDF文件，使用了pdfbox开源项目
     * 
     * @param fileName
     */
    public void readPDF(String fileName) {
        File file = new File(fileName);
        FileInputStream in = null;
        try {
            in = new FileInputStream(fileName);
            // 新建一个PDF解析器对象  
            PDFParser parser = new PDFParser(in);
            // 对PDF文件进行解析  
            parser.parse();
            // 获取解析后得到的PDF文档对象  
            PDDocument pdfdocument = parser.getPDDocument();
            // 新建一个PDF文本剥离器  
            PDFTextStripper stripper = new PDFTextStripper();
            // 从PDF文档对象中剥离文本  
            String result = stripper.getText(pdfdocument);
            System.out.println("PDF文件的文本内容如下：");
            System.out.println(result);

        } catch (Exception e) {
            System.out.println("读取PDF文件" + file.getAbsolutePath() + "生失败！" + e);
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e1) {
                }
            }
        }
    }
    
    public static PdfPTable createPDFTable() {
        return null;
    }
    
    public static void createTableHeader(PdfPTable table, String[] header, Font font) {
        PdfPCell cell;
        for (String str : header) {
            cell = new PdfPCell(new Phrase(str,font));
            cell.setBorder(Rectangle.NO_BORDER);
            cell.setHorizontalAlignment(Element.ALIGN_CENTER);//设置内容水平居中显示
            table.addCell(cell);
        }
    }

    /**
     * 测试pdf文件的创建
     * @param args
     * @throws DocumentException 
     */
    public static void main(String[] args) throws DocumentException {
        String fileName = "D:\\report\\MSF公司采购订单.pdf"; //这里先手动把绝对路径的文件夹给补上。
        PDFUtil pdfUtil = new PDFUtil();
        Font chapterFont = PDFUtil.createCHineseFont(18, Font.BOLD, new BaseColor(0, 0, 0));//文章标题字体 
        Font sectionFont = PDFUtil.createCHineseFont(14, Font.NORMAL, new BaseColor(0, 0, 0));//文章小节字体 
        Font textFont = PDFUtil.createCHineseFont(12, Font.NORMAL, new BaseColor(0, 0, 0));//小节内容字体 
        pdfUtil.createDocument(fileName);
        
        Chapter chapter = PDFUtil.createChapter("MSF公司采购订单", 1, 1, 0, chapterFont);
        pdfUtil.writeChapterToDoc(chapter);

        PdfPTable table = new PdfPTable(6);
        table.setSpacingBefore(15f);//设置表格上面空白宽度
        table.getDefaultCell().setBorder(1);//设置表格默认为无边框
        table.setTotalWidth(800f);//设置表格的宽度
        PdfPCell cell = null;
        cell = new PdfPCell(new Paragraph("订单号：S1290",sectionFont));//建立一个单元格
        cell.setBorder(0);//设置单元格无边框
        cell.setColspan(4);//设置合并单元格的列数
        table.addCell(cell);//增加单元格
        cell = new PdfPCell(new Paragraph("供应商：常州机电",sectionFont));//建立一个单元格
        cell.setBorder(0);//设置单元格无边框
        cell.setColspan(2);//设置合并单元格的列数
        table.addCell(cell);//增加单元格
        String[] header = new String[]{"合同号","规格型号","数量","单价","交货期","备注"};
        for (String str : header) {
            cell = new PdfPCell(new Phrase(str,textFont));
            table.addCell(cell);
        }
        pdfUtil.document.add(table);
        
        pdfUtil.closeDocument();
    }
}
